package com.ads.tpgrupo4.server.xml.mappers;

import java.util.LinkedList;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import com.ads.tpgrupo4.domain.cpr.core.Rodamiento;
import com.ads.tpgrupo4.server.utils.Assertions;
import com.ads.tpgrupo4.server.xml.XmlSource;

public class MaestroDeRodamientosXmlMapper extends AbstractXmlMapper<List<Rodamiento>> {
	
	private static final String EMPTY_STRING = "";
	private static final String ORIGEN = "Origen";
	private static final String MARCA = "Marca";
	private static final String SUFIJO = "Sufijo";
	private static final String SERIE = "serie";
	private static final String ITEM = "Item";
	
	private static MaestroDeRodamientosXmlMapper instance;
	
	public static MaestroDeRodamientosXmlMapper getInstance() {

		if (instance == null) {
			instance = new MaestroDeRodamientosXmlMapper();
		}
		
		return instance;
	}
	
	private MaestroDeRodamientosXmlMapper() {
	}

	@Override
	protected List<Rodamiento> doMap(XmlSource source) throws Exception {
		
		final List<Rodamiento> rodamientos = new LinkedList<Rodamiento>();
		final Document document = source.getDocument();
		final NodeList elements = document.getElementsByTagName(ITEM);

		for (int index = 0; index  < elements.getLength(); index ++) {
		
			final Element element = (Element) elements.item(index );
			
			final String serie = element.getAttribute(SERIE);
			NodeList elemSufijo = element.getElementsByTagName(SUFIJO);
			final String sufijo = elemSufijo.getLength() != 0 ? elemSufijo.item(0).getTextContent() : EMPTY_STRING;
			final String marca = element.getElementsByTagName(MARCA).item(0).getTextContent();
			final String origen = element.getElementsByTagName(ORIGEN).item(0).getTextContent();
			
			Assertions.notNullOrEmpty(serie, msgRequired(SERIE));			
			Assertions.notNullOrEmpty(marca, msgRequired(MARCA));			
			Assertions.notNullOrEmpty(origen, msgRequired(ORIGEN));			

			final Rodamiento rodamiento = new Rodamiento();
			rodamiento.setNumeroDeSerie(serie);
			rodamiento.setSufijo(sufijo);
			rodamiento.setMarca(marca);
			rodamiento.setOrigen(origen);
			
			rodamientos.add(rodamiento);
		}
		
		return rodamientos;
	}

}
